package com.agrimall.mapper;

import com.agrimall.entity.Product;
import org.apache.ibatis.annotations.Param;
import java.util.List;

/**
 * 商品Mapper接口
 */
public interface ProductMapper {
    /**
     * 根据ID查询商品
     */
    Product selectById(Long productId);
    
    /**
     * 插入商品
     */
    int insert(Product product);
    
    /**
     * 更新商品
     */
    int update(Product product);
    
    /**
     * 删除商品
     */
    int delete(Long productId);
    
    /**
     * 查询所有商品（分页）
     */
    List<Product> selectAll(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 根据商户ID查询商品列表
     */
    List<Product> selectByMerchantId(@Param("merchantId") Long merchantId,
                                     @Param("offset") int offset,
                                     @Param("limit") int limit);
    
    /**
     * 根据分类查询商品
     */
    List<Product> selectByCategory(@Param("category") String category,
                                   @Param("offset") int offset,
                                   @Param("limit") int limit);
    
    /**
     * 根据关键字搜索商品
     */
    List<Product> searchByName(@Param("keyword") String keyword,
                               @Param("offset") int offset,
                               @Param("limit") int limit);
    
    /**
     * 统计商品总数
     */
    int countAll();
    
    /**
     * 根据商户ID统计商品数量
     */
    int countByMerchantId(Long merchantId);
    
    /**
     * 根据分类统计商品数量
     */
    int countByCategory(@Param("category") String category);
    
    /**
     * 根据关键字统计商品数量
     */
    int countByKeyword(@Param("keyword") String keyword);
    
    /**
     * 根据商户ID查询商品列表（排除逻辑删除的）
     */
    List<Product> selectByMerchantIdExcludeDeleted(@Param("merchantId") Long merchantId,
                                                    @Param("offset") int offset,
                                                    @Param("limit") int limit);
    
    /**
     * 根据商户ID统计商品数量（排除逻辑删除的）
     */
    int countByMerchantIdExcludeDeleted(Long merchantId);
    
    /**
     * 根据商户ID和商品名称查询商品（排除逻辑删除的）
     */
    List<Product> selectByMerchantIdAndName(@Param("merchantId") Long merchantId,
                                            @Param("keyword") String keyword,
                                            @Param("offset") int offset,
                                            @Param("limit") int limit);
    
    /**
     * 根据商户ID和商品名称统计商品数量（排除逻辑删除的）
     */
    int countByMerchantIdAndName(@Param("merchantId") Long merchantId,
                                  @Param("keyword") String keyword);
    
    /**
     * 根据商户ID和分类查询商品（排除逻辑删除的）
     */
    List<Product> selectByMerchantIdAndCategory(@Param("merchantId") Long merchantId,
                                                @Param("category") String category,
                                                @Param("offset") int offset,
                                                @Param("limit") int limit);
    
    /**
     * 根据商户ID和分类统计商品数量（排除逻辑删除的）
     */
    int countByMerchantIdAndCategory(@Param("merchantId") Long merchantId,
                                     @Param("category") String category);
    
    /**
     * 根据商户ID、商品名称和分类查询商品（排除逻辑删除的）
     */
    List<Product> selectByMerchantIdNameAndCategory(@Param("merchantId") Long merchantId,
                                                    @Param("keyword") String keyword,
                                                    @Param("category") String category,
                                                    @Param("offset") int offset,
                                                    @Param("limit") int limit);
    
    /**
     * 根据商户ID、商品名称和分类统计商品数量（排除逻辑删除的）
     */
    int countByMerchantIdNameAndCategory(@Param("merchantId") Long merchantId,
                                         @Param("keyword") String keyword,
                                         @Param("category") String category);
    
    /**
     * 查询所有商品（管理员，包含逻辑删除的）
     */
    List<Product> selectAllForAdmin(@Param("offset") int offset, @Param("limit") int limit);
    
    /**
     * 统计所有商品数量（管理员，包含逻辑删除的）
     */
    int countAllForAdmin();
    
    /**
     * 管理员多条件查询商品
     */
    List<Product> selectForAdminByConditions(@Param("keyword") String keyword,
                                             @Param("category") String category,
                                             @Param("merchantUsername") String merchantUsername,
                                             @Param("offset") int offset,
                                             @Param("limit") int limit);
    
    /**
     * 管理员多条件统计商品数量
     */
    int countForAdminByConditions(@Param("keyword") String keyword,
                                  @Param("category") String category,
                                  @Param("merchantUsername") String merchantUsername);
    
    /**
     * 逻辑删除商品（设置status=-1）
     */
    int logicalDelete(Long productId);
    
    /**
     * 恢复删除的商品（设置status=1）
     */
    int restoreProduct(Long productId);
    
    /**
     * 按商品分类分组统计商品数量
     */
    List<java.util.Map<String, Object>> countByCategoryGroup();
}



